home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 1.iso / ARGONET / PD / PROGRAMMING / DESKLIBC / SOURCES.ZIP / DeskLib / !DLSources / Libraries / Filing / c / ReadDir < prev    next >
Text File  |  1995-07-22  |  6KB  |  202 lines

  1. /*
  2.     ####             #    #     # #
  3.     #   #            #    #       #          The FreeWare C library for
  4.     #   #  ##   ###  #  # #     # ###             RISC OS machines
  5.     #   # #  # #     # #  #     # #  #   ___________________________________
  6.     #   # ####  ###  ##   #     # #  #
  7.     #   # #        # # #  #     # #  #    Please refer to the accompanying
  8.     ####   ### ####  #  # ##### # ###    documentation for conditions of use
  9.     ________________________________________________________________________
  10.  
  11.     File:    Filing.ReadDir.c
  12.     Author:  Copyright © 1994, 1995 Sergio Monesi
  13.     Version: 1.01 (6 Jun 1995)
  14.     Purpose: Reads directory content easily
  15.     Mods:    6 June 1995 - changed procedure names to a more
  16.                            DeskLib-compliant style
  17.              07 Jun 1995 - JS - moved definition of __outofmemory to inside
  18.                                 function when compiling a DLL - otherwise
  19.                                 cc complains about 'RISC OS (or other reentrant 
  20.                                 module has static init. to data 'x$dataseg''.
  21.  
  22. */
  23.  
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <stdio.h>
  27.  
  28. #include "DeskLib:Core.h"
  29. #include "DeskLib:Filing.h"
  30. #include "DeskLib:Error.h"
  31.  
  32. #include "Errors.h"
  33.  
  34. /* Note: this functions use malloc to allocate memory. If you want to use
  35.          a different way (mem, flex, heap, etc.) change the lines below
  36.          but be careful about the way in which parameters are passed. */
  37.  
  38. #define MALLOC(size) malloc((size))
  39. #define FREE(ptr)    free((ptr))
  40.  
  41.  
  42. #ifndef _DLL
  43. error_STATIC( __outofmemory,filing_ERROR_OutOfMemory,"Not enough memory");
  44. #endif
  45.  
  46.  
  47. os_error *Filing_OpenDir(char *dirname, filing_dirdata *dirdata,
  48.                          int bufsize, filing_readdirtype type)
  49. {
  50.  os_error *er;
  51.  filing_objtype objtype;
  52.  
  53. #ifdef _DLL
  54. error_FIXED( __outofmemory,filing_ERROR_OutOfMemory,"Not enough memory");
  55. #endif
  56.  
  57.  dirdata->buf=NULL;
  58.  dirdata->dirname=NULL;   /* to avoid problems with free in Filing_CloseDir */
  59.  
  60.  if (er=Filing_ReadCatalogue(dirname,&objtype,NULL,NULL,NULL,NULL,NULL),er!=NULL)
  61.    return er;
  62.  if (objtype==1) {
  63.    error_global.errnum=filing_ERROR_DirectoryIsFile;
  64.    sprintf(error_global.errmess,"Directory '%s' is actually a file!",dirname);
  65.    return &error_global;
  66.  }
  67.  else if (objtype==0) {
  68.    error_global.errnum=filing_ERROR_DirectoryDoesntExist;
  69.    sprintf(error_global.errmess,"Directory '%s' doesn't exist!",dirname);
  70.    return &error_global;
  71.  }
  72.  
  73.  dirdata->dirname=MALLOC(strlen(dirname)+1);
  74.  if (dirdata->dirname==NULL)
  75.    return __outofmemory;
  76.  strcpy(dirdata->dirname,dirname);
  77.  
  78.  dirdata->buf=MALLOC(bufsize);
  79.  if (dirdata->buf==NULL)
  80.    return __outofmemory;
  81.  
  82.  dirdata->size=bufsize;
  83.  dirdata->type=type;
  84.  dirdata->offset=0;
  85.  dirdata->read=0;
  86.  dirdata->match=NULL;  /* this is currently always set to NULL so that all */
  87.                        /* the files in the directory are read (NULL="*")   */
  88.  
  89.  /* adesso bisogna iniziare a leggere la directory... */
  90.  /* ...no, forse e` inutile... per adesso non lo faccio... */
  91.  
  92. /* switch(type) {
  93.    case readdirtype_DIRENTRY:
  94.     break;
  95.  
  96.  }*/
  97.  
  98.  return NULL;
  99. }
  100.  
  101. void *Filing_ReadDir(filing_dirdata *dirdata)
  102. {
  103.  os_error *er;
  104.  
  105.  if (dirdata->read==0) {    /* no more objects read in the buffer */
  106.    if (dirdata->offset==-1) {    /* no more objects to read */
  107.      return NULL;
  108.    }
  109.  
  110.    dirdata->read=255;   /* objects to read */
  111.  
  112.    switch(dirdata->type) {
  113.      case readdirtype_DIRENTRY:
  114.       er=Filing_ReadDirEntry(dirdata->dirname,(filing_direntry *)dirdata->buf,
  115.                              &dirdata->read,&dirdata->offset,
  116.                              dirdata->size,dirdata->match);
  117.       if (er!=NULL) {
  118.         return NULL;
  119.       }
  120.       if (dirdata->read==0) {
  121.         dirdata->offset=-1;
  122.         return NULL;
  123.       }
  124.       dirdata->read--;
  125.       dirdata->act.direntry=(filing_direntry *)dirdata->buf;
  126.       break;
  127.      case readdirtype_FULLDIRENTRY:
  128.       er=Filing_ReadFullDirEntry(dirdata->dirname,(filing_fulldirentry *)dirdata->buf,
  129.                                  &dirdata->read,&dirdata->offset,
  130.                                  dirdata->size,dirdata->match);
  131.       if (er!=NULL) {
  132.         return NULL;
  133.       }
  134.       if (dirdata->read==0) {
  135.         dirdata->offset=-1;
  136.         return NULL;
  137.       }
  138.       dirdata->read--;
  139.       dirdata->act.fulldirentry=(filing_fulldirentry *)dirdata->buf;
  140.       break;
  141.      case readdirtype_NAMEONLY:
  142.       er=Filing_ReadDirNames(dirdata->dirname,(char *)dirdata->buf,
  143.                              &dirdata->read,&dirdata->offset,
  144.                              dirdata->size,dirdata->match);
  145.       if (er!=NULL) {
  146.         return NULL;
  147.       }
  148.       if (dirdata->read==0) {
  149.         dirdata->offset=-1;
  150.         return NULL;
  151.       }
  152.       dirdata->read--;
  153.       dirdata->act.name=(char *)dirdata->buf;
  154.       break;
  155.    }
  156.  
  157.  }
  158.  else {     /* some object is ready in buffer */
  159.    switch(dirdata->type) {
  160.      case readdirtype_DIRENTRY:
  161.       dirdata->read--;
  162.       dirdata->act.direntry=(filing_direntry *)(((int)(&(dirdata->act.direntry->name))+
  163.                                                strlen(dirdata->act.direntry->name)+4)&~3);
  164.       break;
  165.      case readdirtype_FULLDIRENTRY:
  166.       dirdata->read--;
  167.       dirdata->act.fulldirentry=(filing_fulldirentry *)(((int)(&(dirdata->act.fulldirentry->name))+
  168.                                                        strlen(dirdata->act.fulldirentry->name)+4)&~3);
  169.       break;
  170.      case readdirtype_NAMEONLY:
  171.       dirdata->read--;
  172. /*      dirdata->act.name=(char *)(((int)(&(dirdata->act.name))+strlen(dirdata->act.name)+4)&~3);*/
  173.       dirdata->act.name=(char *)(dirdata->act.name+strlen(dirdata->act.name)+1);
  174.       break;
  175.    }
  176.  
  177.  }
  178.  
  179.  return (void *)dirdata->act.act;
  180. }
  181.  
  182. BOOL Filing_CloseDir(filing_dirdata *dirdata)
  183. {
  184.  BOOL ret=TRUE;
  185.  
  186.  if (dirdata->buf!=NULL) {
  187.    FREE(dirdata->buf);
  188.  }
  189.  else {
  190.    ret=FALSE;
  191.  }
  192.  
  193.  if (dirdata->dirname!=NULL) {
  194.    FREE(dirdata->dirname);
  195.  }
  196.  else {
  197.    ret=FALSE;
  198.  }
  199.  
  200.  return ret;
  201. }
  202.